package com.chenjun.designpattern.behavior.iterator;

/**
 * 模仿java类集框架中的迭代器设计模式
 * @author admin
 *
 */
public class 迭代器模式2
{

	public static void main(String[] args)
	{
		List<Integer> list = new ArrayList();
		MyIterator<Integer> mit = list.iterator();
		while(mit.hasNext())
		{
			System.out.println(mit.next());
		}
	}
}

/**
 * 顶层的抽象接口Collection
 * @author admin
 *
 * @param <E>
 */
interface Collection<E> extends Iterable<E>
{
	
}

/**
 * 抽象行为接口，表示可迭代的集合，实现该接口代表一种可以进行的操作——迭代
 * @author admin
 *
 * @param <E>
 */
interface Iterable<E>
{
	MyIterator<E> iterator();
}

/**
 * 次级抽象接口List，线性表抽象
 * @author admin
 *
 * @param <E>
 */
interface List<E> extends Collection<E>
{
	
}

/*
 *为了避免同包下java类重名，故改名为MyIterator
 * @author admin
 *
 * @param <E>
 */
interface MyIterator<E>
{
	boolean hasNext();
	 E next();
	 void remove();
}

class ArrayList implements  List<Integer>
{
	private Integer []arr = {1,2,3,4,5,6,7,8,9,10};
	@Override
	public MyIterator<Integer> iterator()
	{
		return new ConcreteIterator();
	}
	
	/**
	 * 这里之所以要写成内部类，是因为ArrayList返回Iterator的源码也是用内部类实现的
	 * @author admin
	 *也正是因为这里是内部类，可以非常方便的访问得到ArrayList内部的所有对象细节
	 * @param <String>
	 */
	private class ConcreteIterator implements MyIterator<Integer> 
	{
		private int index = -1;
		private int size = arr.length -1;
		public ConcreteIterator()
		{
			
		}

		@Override
		public boolean hasNext()
		{
			return index < size;
		}

		@Override
		public Integer next()
		{
			index++;
			return arr[index];
		}

		@Override
		public void remove()
		{
			//暂时不实现，因为本程序主要研究设计模式， 不讨论算法
		}
		
	}
}
